home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LT_IMsg.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-22
|
5KB
|
202 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
#define MESSAGE_COOKIE 0x19138AFB
/****** gtlayout.library/LT_GetIMsg ******************************************
*
* NAME
* LT_GetIMsg -- Retrieve the next pending IntuiMessage
* from the window associated with a
* LayoutHandle.
*
* SYNOPSIS
* IntuiMessage = LT_GetIMsg(Handle);
* D0 A0
*
* struct IntuiMessage *LT_GetIMsg(LayoutHandle *);
*
* FUNCTION
* This routine will handle most of the input loop for
* you. Just pass the pointer to the layout handle in,
* check if the result code is non-null, copy the data
* you need and reply the message via LT_ReplyIMsg().
*
* You will still need to wait for new input, as LT_GetIMsg
* will poll the MsgPort of the window.
*
* LT_GetIMsg() will try its best to distinguish between
* different LayoutHandles sharing the same Window->UserPort.
* If it finds that the window the message was sent to is
* using a different LayoutHandle, it will switch to using
* this handle (V13).
*
* INPUTS
* Handle - Pointer to LayoutHandle structure
*
* RESULT
* IntuiMessage - Pointer to IntuiMessage structure
*
* NOTES
* You *must not* make any assumptions about the contents
* of the IntuiMessage structure except for the following
* entries:
*
* Class
* Code
* Qualifier
* IAddress
*
* When finished, you must dispose the IntuiMessage via
* LT_ReplyIMsg or memory will be lost which can never
* be reclaimed.
*
* DO NOT CALL LT_HandleInput() ON THE DATA YOU RECEIVE
* FROM LT_GetIMsg() AS LT_GetIMsg() ALREADY DOES ALL THE
* MAGIC LT_HandleInput() OTHERWISE WOULD NEED TO DO!
* IF YOU STILL DO CALL LT_HandleInput() ON THE DATA YOU
* WILL RECEIVE `GHOST' EVENTS.
*
* SEE ALSO
* gtlayout.library/LT_ReplyIMsg
*
******************************************************************************
*
*/
struct IntuiMessage * LIBENT
LT_GetIMsg(REG(a0) struct LayoutHandle *Handle)
{
if(Handle)
{
struct IntuiMessage *Msg = GT_GetIMsg(Handle->Window->UserPort);
if(Msg)
{
struct IntuiMessage *Clone;
// For multiple handles sharing the same UserPort
if(Msg->IDCMPWindow->UserData && !((ULONG)Msg->IDCMPWindow->UserData & 1))
{
LayoutHandle *Local = (LayoutHandle *)Msg->IDCMPWindow->UserData;
if(Local->PointBack == Local)
Handle = Local;
else
return(Msg);
}
else
return(Msg);
if(Msg->Class == IDCMP_SIZEVERIFY && Handle->ResizeView)
{
// They're coming to take me away, HAHA!
Handle->SizeVerified = TRUE;
Handle->SizeWidth = Handle->Window->Width;
Handle->SizeHeight = Handle->Window->Height;
LTP_StripGadgets(Handle,Handle->List);
// Fake a null event, otherwise the following
// IDCMP_NEWSIZE would probably not get through
if(Clone = (struct IntuiMessage *)AllocMem(sizeof(struct IntuiMessage),MEMF_ANY))
{
CopyMem(Msg,Clone,sizeof(struct IntuiMessage));
Clone->Class = NULL;
Clone->ExecMessage.mn_Node.ln_Name = (char *)MESSAGE_COOKIE;
Clone->ExecMessage.mn_Node.ln_Pri = -114;
Clone->ExecMessage.mn_ReplyPort = (struct MsgPort *)Clone;
Clone->SpecialLink = (struct IntuiMessage *)Clone;
GT_ReplyIMsg(Msg);
}
}
else
{
if(Clone = (struct IntuiMessage *)AllocMem(sizeof(struct IntuiMessage),MEMF_ANY))
{
CopyMem(Msg,Clone,sizeof(struct IntuiMessage));
Clone->ExecMessage.mn_Node.ln_Name = (char *)MESSAGE_COOKIE;
Clone->ExecMessage.mn_Node.ln_Pri = -114;
Clone->ExecMessage.mn_ReplyPort = (struct MsgPort *)Clone;
Clone->SpecialLink = (struct IntuiMessage *)Clone;
GT_ReplyIMsg(Msg);
LT_HandleInput(Handle,Clone->Qualifier,&Clone->Class,&Clone->Code,(struct Gadget **)&Clone->IAddress);
}
}
if(Clone)
return(Clone);
else
GT_ReplyIMsg(Msg);
}
}
return(NULL);
}
/*****************************************************************************/
/****** gtlayout.library/LT_ReplyIMsg ******************************************
*
* NAME
* LT_ReplyIMsg -- Dispose of an IntuiMessage received
*
* SYNOPSIS
* LT_ReplyIMsg(IntuiMessage);
* A0
*
* VOID LT_ReplyIMsg(struct IntuiMessage *);
*
* FUNCTION
* This routine complements LT_GetIMsg().
*
* INPUTS
* IntuiMessage - Pointer to IntuiMessage structure,
* passing NULL is harmless.
*
* RESULT
* none
*
* NOTES
* Only pass IntuiMessages you received via LT_GetIMsg,
* or things will get tough.
*
* SEE ALSO
* gtlayout.library/LT_GetIMsg
*
******************************************************************************
*
*/
VOID LIBENT
LT_ReplyIMsg(REG(a0) struct IntuiMessage *Msg)
{
if(Msg)
{
if(Msg->SpecialLink == (struct IntuiMessage *)Msg && Msg->ExecMessage.mn_Node.ln_Name == (char *)MESSAGE_COOKIE && Msg->ExecMessage.mn_Node.ln_Pri == -114 && Msg->ExecMessage.mn_ReplyPort == (struct MsgPort *)Msg)
FreeMem(Msg,sizeof(struct IntuiMessage));
else
GT_ReplyIMsg(Msg);
}
}